package org.llc.user.client;

import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;


/**
 * oauth 远程调用
 * @author llc
 * @date 2019/12/17 16:31
 * @since 1.0.0
 */
@FeignClient(value = "authorization-service")
public interface OauthClient {

    /**
     * 密码模式获取token
     * @param type              oauth2认证模式
     * @param authType          认证类型      （用户名密码 -> password , 用户名密码验证码 -> verification）
     * @param username          用户名/手机号
     * @param password          密码
     * @param verificationCode  验证码       （验证码参与授权时使用）
     * @param key               验证码唯一键 （验证码参与授权时使用）
     * @param clientId          客户端
     * @param secret            密钥
     * @param scope             应用授权作用域
     * @return com.mogu.starter.base.bean.Result
     * @author llc
     * @date 2019/12/17 16:35
     */
    @RequestMapping(value = "/oauth/token", method = RequestMethod.POST ,consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    JSONObject getToken(@RequestParam("grant_type") String type,
                    @RequestParam("auth_type") String authType,
                    @RequestParam("username") String username,
                    @RequestParam("password") String password,
                    @RequestParam("verification_code") String verificationCode,
                    @RequestParam("key") String key,
                    @RequestParam("client_id") String clientId,
                    @RequestParam("client_secret") String secret,
                    @RequestParam("scope") String scope);

    /**
     * 密码模式获取token
     * <p>手机号 + 验证码</p>
     * @param type              oauth2认证模式 password
     * @param authType          认证类型      （用户名密码 -> password , 用户名密码验证码 -> verification）
     * @param phoneNumber       手机号
     * @param phoneCode         短信验证码
     * @param clientId          客户端
     * @param secret            密钥
     * @param scope             应用授权作用域
     * @return com.mogu.starter.base.bean.Result
     * @author llc
     * @date 2019/12/17 16:35
     */
    @RequestMapping(value = "/oauth/token", method = RequestMethod.POST ,consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    JSONObject getTokenByPhone(@RequestParam("grant_type") String type,
                        @RequestParam("auth_type") String authType,
                        @RequestParam("phoneNumber") String phoneNumber,
                        @RequestParam("phoneCode") String phoneCode,
                        @RequestParam("client_id") String clientId,
                        @RequestParam("client_secret") String secret,
                        @RequestParam("scope") String scope);

    /**
     * 授权码模式获取token
     * @param type           oauth2认证模式 password
     * @param code           授权码
     * @param redirectUri    重定向URL
     * @param clientId       客户端ID
     * @param clientSecret   客户端密钥
     * @return com.alibaba.fastjson.JSONObject
     * @author llc
     * @date 2020/5/6 17:05
     */
    @RequestMapping(value = "/oauth/token", method = RequestMethod.POST ,consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    JSONObject getTokenByAuthorizationCode(@RequestParam("grant_type") String type,
                        @RequestParam("code") String code,
                        @RequestParam("redirect_uri") String redirectUri,
                        @RequestParam("client_id") String clientId,
                        @RequestParam("client_secret") String clientSecret);


    /**
     * 刷新token
     * @param grantModeRefreshToken oauth2认证模式
     * @param refreshToken          刷新token
     * @param clientId              客户端ID
     * @param clientSecret          客户端密钥
     * @param scope                 应用授权作用域 (刷新token时可缩减应用授权作用域)
     * @return com.alibaba.fastjson.JSONObject
     * @author llc
     * @date 2020/5/13 14:17
     */
    @RequestMapping(value = "/oauth/token", method = RequestMethod.POST ,consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    JSONObject getTokenByRefreshToken(@RequestParam("grant_type") String grantModeRefreshToken,
                                      @RequestParam("refresh_token") String refreshToken,
                                      @RequestParam("client_id") String clientId,
                                      @RequestParam("client_secret") String clientSecret,
                                      @RequestParam("scope") String scope);
    /**
     * 密码模式微信授权登录
     * @param type      oauth2认证模式 password
     * @param authType  weChat
     * @param unionId   微信ID
     * @param clientId  客户端ID
     * @param secret    客户端密钥
     * @param scope     应用授权作用域
     * @return com.alibaba.fastjson.JSONObject
     * @author llc
     * @date 2020/5/21 12:48
     */
    @RequestMapping(value = "/oauth/token", method = RequestMethod.POST ,consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    JSONObject getTokenByWeChat(@RequestParam("grant_type") String type,
                                @RequestParam("auth_type") String authType,
                                @RequestParam("unionId") String unionId,
                                @RequestParam("client_id") String clientId,
                                @RequestParam("client_secret") String secret,
                                @RequestParam("scope") String scope);
}

